/**
 * @file log_print.c
 * @author Linquan 
 * @brief  非阻塞式打印，支持主循环打印以及串口中断发送打印
 * @version 0.1
 * @date 2025-10-10
 * 
 * @copyright Copyright (c) 2025
 * 
 */

#include "log_print.h"
#include "scififo.h"
#include <stdio.h>
#include <stdarg.h>

/* 底层驱动函数依赖 */
//#include "usart.h"





/* 使用串口进行打印 */
#define UART_PRINT()\
	char data, len;\
	if(LL_USART_IsActiveFlag_TXE(USART3)) {\
		len = scififo_remove(SCIFIFO(log_print_buff), &data, 1);\
		if(len != 0)\
		{\
			LL_USART_TransmitData8(USART3,data);\
		}\
	}\


/* linux 环境下的测试函数 */
#define LINUX_PRINT()\
	char data, len;\
	extern uint8_t is_tx_ok();\
	extern void tx_ing();\
	if( is_tx_ok() == 0 ) {\
		len = scififo_remove(SCIFIFO(log_print_buff), &data, 1);\
		if(len != 0)\
		{\
			printf("%c",data);\
			tx_ing();\
		}\
	}\



#define _LOG_send()		LINUX_PRINT() //UART_PRINT()

DECLARE_SCIFIFO(log_print_buff, char, 4096);


void log_buff_init()
{
	INIT_SCIFIFO(log_print_buff);
}


/* fputc中追加数据 */
void log_buff_append(char byte)
{
	scififo_append(SCIFIFO(log_print_buff), &byte, 1);
}

/* 打印函数 */
char temp_data[256];
void log_printf(const char * format, ... ) 
{
    va_list 	args;
    int32_t 	len;

    va_start(args, format);

    len = vsnprintf (temp_data, 256, format, args);
		
    va_end (args);
	
	if(len>0 && len <256)
	{
		scififo_append(SCIFIFO(log_print_buff), temp_data, len);

		#if SEND_BY_IT
		LL_USART_EnableIT_TXE(USART3);
		#endif
		
	}
}



/*  主循环里调用发送 */
void log_print_serve()
{	
	// 调用打印相关的函数
	_LOG_send();

	


}


#if SEND_BY_IT
/* 串口发送为空 中断回调 调用*/
void log_print_serve_IT()
{
	char data, len;
		
	len = scififo_remove(SCIFIFO(log_print_buff), &data, 1);
	if(len != 0)
	{
		LL_USART_TransmitData8(USART3,data);
	}
	else
	{
		LL_USART_DisableIT_TXE(USART3);
	}	
}

#endif



#if 0
/* 延迟太大，无法使用*/
void log_print_recv_from_USART()
{
	if (LL_USART_IsActiveFlag_RXNE_RXFNE(USART3))  // 检查是否有数据接收
	{
		uint8_t recv_data = LL_USART_ReceiveData8(USART3);
		tiny_shell_get_data(recv_data);
	}
}
#endif




